#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@file:singer.py
@author:LifeTime
@date: 2018/05/07
@version: 
    v1.1 2018-05-07 fix bug
    v1.0 2018-05-07 create
@input: 需要就写，不需要就不写
@output:需要就写，不需要就不写

b. 编写一个《chart topping歌曲排行榜》的菜单脚本,可无限制查询,直到退出菜单,主要功能如下:
    1. 增加歌手
    2. 显示歌手名单
    3. 删除歌手:删除歌手名字的时候，可以根据编号删除也可以根据名字删除
    4. 显示歌库
    5. 删除歌曲
    6. 增加歌曲
    7. 统计功能:有多少歌手、有多少歌曲
    8. 查询歌手是否在名单中
    9. 查询歌曲是否在歌单中
    0. 退出菜单
    请输入你要使用的功能:


----目前未管理当歌手或者歌手所唱的歌曲重名时的一些选择性操作---
已实现基本功能，并进行检测，
已设置输入选择格式错误提醒，
每个功能选择错误3次会返回菜单
"""
# pause 功能---由于不知名pycharm原因出现乱码
# import os
# os.system("pause")
# print("yes")

# import subprocess
# subprocess.call("pause",shell=True)
# print("yes")

sings = {'0001': {'name': '周杰伦', 'sing': {'双截棍','青花瓷'}},
         '0020': {'name': '刘德华', 'sing': {'男人哭吧哭吧不是罪'}},
         '0101': {'name': '郑丽君', 'sing': {'甜蜜蜜'}},
         '0301': {'name': '张学友', 'sing': {'吻别'}},
         '0111': {'name': '王力宏', 'sing': {'花田错'}},
         '1001': {'name': '任贤齐', 'sing': {'风云决'}},
         '2001': {'name': '陈奕迅', 'sing': {'十年'}},}
sings_id = sings.keys()

# 类型检测
# for i in sings.values():
#     print(i['name'],type(i['sing']))

sings_name = set()
# for names in sings.values():
#     sings_name.add(names['name'])

singS = set()
# for i in sings.values():
#     for j in i['sing']:
#         singS.add(j)

#将歌曲添加到歌曲库singS中
def singS_update():
    for i in sings.values():
        for j in i['sing']:
            # print(j)
            singS.add(j)

# 将歌手名全部添加到set集合sings_name
def sings_name_update():
    for names in sings.values():
        sings_name.add(names['name'])

# print(sings_id,type(sings_id))
#print(type(sings_name))

#限制性确认选择
def choice_limt():
    time =0
    while True:
        choose = input("是否确认：yes/no？  ")
        if choose =='yes':
            return True
        elif choose =='no':
            return False
        elif time ==2:
            print("错误三次，即将返回！")
            return False
        else:
            print("格式错误，请重新确认！")
            time +=1

#歌手添加
def singer_add (sings):
    time =0
    while True:
        if time == 3:
            print("错误三次，即将返回！")
            break

        name=input("请输入想要添加的歌手名：")
        #判断输入是否合法
        if name in sings_name:
            print("当前歌手已存在，请重新输入！")
        elif time == 3:
            print("错误三次，即将返回！")
            break
        elif name not in sings_name:
            #去空格  主要针对接受输入时尾部空格前面不会判断出错
            name=name.strip()
            name_id =input("请输入新添加歌手的编号：")
            if time == 3:
                print("错误三次，即将返回！")
                break
            elif not name_id.isdigit():
                print("格式错误，请重新确认！")
                time += 1
            elif name_id not in sings_id:
                print("当前添加歌手编号：{} \t歌手：{}".format(name_id,name))
                #确认操作
                if choice_limt():
                    a=set()
                    sings.update({name_id:{'name':name,'sing':a}})
                    #print(sings[name_id]['sing'],type(sings[name_id]['sing']))
                    print("添加成功！")
                    break
            else:
                print("当前编号已重复，请重新输入！")
                time+=1
        else:
            print("格式错误，请重新确认！")
            time += 1

#歌手名单显示
def singer_show ():
    for n in sings.keys():
        print("歌手编号：{}\t 歌手：{}".format(n,sings[n]['name']))

#歌手删除
def singer_delect ():
    time=0
    while True:
        if time == 3:
            print("错误三次，即将返回！")
            break

        choose=input("请选择删除方式----1.编号删除  2.姓名删除？")
        if choose =='1':
            time=0
            id =input("请输入需要删除的歌手编号：")
            if not id.isdigit():
                print("格式错误，请重新选择！")
                time+=1
            elif id not in sings_id:
                print("当前歌手编号不存在，请重新选择！")
                time+=1
            else:
                print("当前删除歌手编号：{} \t歌手：{}".format(id,sings[id]['name']))
                if choice_limt():
                    sings.pop(id)
                    print("删除成功！")
                    break
        elif choose =='2':
            time = 0
            name = input("请输入需要删除的歌手姓名：")
            name = name.strip()
            if not name.isalnum():
                print("格式错误，请重新选择！")
                time+=1
            elif name not in sings_name:
                print("当前歌手不存在，请重新选择！")
                time+=1
            else:
                for i in sings.keys():
                    if sings[i]['name']==name:
                        id=i
                print("当前删除歌手编号：{} \t歌手：{}".format(id,name))
                if choice_limt():
                    sings.pop(id)
                    print("删除成功！")
                    break
        elif time == 2:
            print("错误三次，即将返回！")
            break
        else:
            print("格式错误，请重新选择！")
            time += 1

#查询歌手
def singer_select ():
    while True:
        name=input("请输入你想要查询的歌手(quit退出)：")
        name = name.strip()
        if name=='quit':
            break
        elif not name.isalnum():
            print("格式错误，请重新输入！")
        elif name not in sings_name:
            print("所查询歌手不存在！")
        elif name in sings_name:
            id=0
            for i in sings.keys():
                if sings[i]['name'] == name:
                    id = i
            print("歌手编号：{} \t歌手：{} 歌曲：".format(id, name),end='')
            for i in sings[id]['sing']:
                print(i, end=' ')
            print('')
        else :
            print("格式错误，请重新输入！")

#显示歌库
def sing_show ():
    for i in sings.values():
        print("歌手：{} \t歌曲：".format(i['name']),end='')
        for j in i['sing']:
            print(j,end=' ')
        print('')

#歌曲删除
def sing_delect ():
    time = 0
    while True:
        if time == 3:
            print("错误三次，即将返回！")
            break
        sing = input("请输入需要删除的歌曲名：")
        sing = sing.strip()
        if not sing.isalnum():
            print("格式错误，请重新输入！")
            time += 1
        elif sing not in singS:
            print("当前歌曲不存在，请重新输入！")
            time += 1
        elif sing in singS:
            for i in sings.values():
                for j in i['sing']:
                    if j == sing:
                        name = i['name']
            for i in sings.keys():
                if sings[i]['name'] == name:
                    id = i
            print("当前删除歌手编号：{} \t歌手：{} 的歌曲：{}".format(id, name, sing))
            if choice_limt():
                for i in sings.values():
                    for j in i['sing']:
                        if j == sing:
                            name = i['name']
                for i in sings.keys():
                    if sings[i]['name'] == name:
                        id = i
                #pop方法进行删除出错 最后采用差集删除set中的歌曲
                sings[id]['sing']=sings[id]['sing']-{sing}
                print("删除成功！")
                break
        elif time == 2:
            print("错误三次，即将返回！")
            break
        else:
            print("格式错误，请重新选择！")
            time += 1
    return

#歌曲添加
def sing_add ():
    while True:
        id=0
        sing = input("请输入你想要添加的歌曲名(quit退出)：")
        sing = sing.strip()
        if sing == 'quit':
            break
        elif not sing.isalnum():
            print("格式错误，请重新输入！")
        elif sing in singS:
            print("所添加歌曲已存在！")
        elif sing not in singS:
            name=input("请输入你想要添加歌曲的歌手名：")
            name.strip()
            if name in sings_name:
                for i in sings.keys():
                    if sings[i]['name'] == name:
                        id = i
                print("当前添加歌手编号：{} \t歌手：{} 歌曲：{}".format(id, name,sing))
                if choice_limt():
                    sings[id]['sing'].add(sing)
                    print("添加成功!")
                    break
            else:
                print("歌手不存在！")
        else:
            print("格式错误，请重新输入！")
    return

#歌曲查询
def sing_select ():
    while True:
        id=0
        sing = input("请输入你想要查询的歌曲(quit退出)：")
        sing = sing.strip()
        if sing == 'quit':
            break
        elif not sing.isalnum():
            print("格式错误，请重新输入！")
        elif sing not in singS:
            print("所查询歌曲不存在！")
        elif sing in singS:
            for i in sings.values():
                for j in i['sing']:
                    if j == sing:
                        name = i['name']
            for i in sings.keys():
                if sings[i]['name'] == name:
                    id = i
            print("歌手编号：{} \t歌手：{} 歌曲：{}".format(id, name, sing))
        else:
            print("格式错误，请重新输入！")
    return

#统计功能 --暂时未设置复杂操作 从简
#例如选择性 统计歌手 /统计歌曲 /统计某个歌手的歌曲
def sings_count():
    m=0
    number=0
    for i in sings.values():
        m+=1
        n=0
        for j in i['sing']:
            n+=1
            number=number+n
        print("歌手：{} 共有{}首歌曲".format(i['name'],n))
    print("一共有{}位歌手 {}首歌曲".format(m,number))
    return



# 分割线
def cut_off (str):
    print('='*14,str,'='*14)


#正文
print("""     《chart topping 歌曲排行榜》     """)
while True:
    sings_name_update()
    singS_update()
    cut_off('功能菜单')
    print("""        1. 增加歌手
        2. 歌手名单
        3. 删除歌手
        4. 显示歌库
        5. 删除歌曲
        6. 增加歌曲
        7. 统计功能
        8. 查询歌手
        9. 查询歌曲
        0. 退出菜单""")
    print('='*38)
    choose=input("请输入你要使用的功能：")
    if not choose.isdigit():
        print("请输入正确的格式！")
    elif int(choose)==1 :
        cut_off('增加歌手')
        singer_add(sings)
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==2:
        cut_off('歌手名单')
        singer_show()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==3:
        cut_off('删除歌手')
        singer_delect()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==4:
        cut_off('显示歌库')
        sing_show()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==5:
        cut_off('删除歌曲')
        sing_delect()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==6:
        cut_off('增加歌曲')
        sing_add()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==7:
        cut_off('统计功能')
        sings_count()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==8:
        cut_off('查询歌手')
        singer_select()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==9:
        cut_off('查询歌曲')
        sing_select()
        if input("按回车键返回菜单！ "):
            continue
    elif int(choose)==0:
        cut_off('==退出==')
        break
    else:
        print("请输入正确的格式！")
